//
// Created by Administrator on 2025/8/20.
//

#ifndef INC_12_FREERTOS_LWIP_MQTT_NEWLAND_SENSOR_MANAGER_H
#define INC_12_FREERTOS_LWIP_MQTT_NEWLAND_SENSOR_MANAGER_H

#include "main.h"
#include "FreeRTOS.h"
#include "lvgl.h"
typedef struct {
    lv_obj_t *card;
    lv_obj_t *indicator;
}sensor_lv_obj_struct_t;

typedef enum {
    FORMULA_TEMP,
    FORMULA_HUMI,
    FORMULA_INT,
    FORMULA_AIO,
    FORMULA_AIO_AIR_P,
}sensor_decode_formula_t;

typedef enum {
    SENSOR_DATA_TYPE_INT,
    SENSOR_DATA_TYPE_FLOAT,
    SENSOR_DATA_TYPE_STRING,
    SENSOR_DATA_TYPE_ARRAY,
    SENSOR_DATA_TYPE_TIME,
}sensor_data_type_t;

typedef struct {
    const char* id;         // 传感器ID，例如 "m_temp"
    sensor_data_type_t type; // 数据类型
    union {                  // 使用 union 来存储不同类型的值
        int    val_int;
        float  val_float;
        char* val_string;
    } value;

} sensor_data_item_t;

// 定义传感器/执行器的方向（是输入还是输出）
typedef enum {
    SENSOR_DIR_INPUT,  // 只写的执行器，例如继电器
    SENSOR_DIR_OUTPUT, // 只输出的传感器，例如温度计
    SENSOR_DIR_INOUT   // 可读可写的设备，例如LED灯（可以读取其状态，也可以控制）
} sensor_direction_t;

// 定义读写函数的指针类型
// 使用一个void* context参数，以增加灵活性，可以传递GPIO端口、引脚、I2C地址等信息
typedef union {
    int   val_int;
    float val_float;
    char* val_string;
} sensor_value_t;

// 读取函数指针原型
// 成功返回pdPASS，并通过*value传回读取到的值
typedef BaseType_t (*sensor_read_func_t)(uint8_t slave_addr,uint8_t start_addr,uint8_t reg_num,sensor_decode_formula_t formula, sensor_value_t *regs);

// 写入函数指针原型
// 成功返回pdPASS
typedef BaseType_t (*sensor_write_func_t)(uint8_t slave_addr,uint8_t start_addr,sensor_value_t value);


// 最终的传感器配置结构体
typedef struct {
    char id[32];                     // 传感器/数据点的唯一ID，例如 "m_temp"
    char name[64];                   // 人类可读的名称，例如 "内部温度" (Web端显示用)
    sensor_data_type_t type;         // 数据类型 (int, float, string...)
    sensor_direction_t direction;    // 数据方向 (输入/输出)

    sensor_read_func_t read_func;    // 指向“如何读取这个传感器”的函数指针
    sensor_write_func_t write_func;  // 指向“如何写入/控制这个设备”的函数指针

    void *context;                   // 传递给read/write函数的上下文参数 (例如GPIO_TypeDef*)
    uint16_t context_pin;            // 附加上下文参数 (例如GPIO_PIN_x)

    uint8_t slave_addr;
    uint8_t start_addr;
    uint8_t reg_num;
    sensor_decode_formula_t decode_formula;

    sensor_lv_obj_struct_t ui_obj;

    sensor_value_t data;

    // 其他元数据 (Web端可能会用到)
    char unit[16];                   // 单位, 例如 "°C"
    uint32_t sample_interval_ms;     // 采样间隔（0表示仅在请求时读取）

} sensor_config_t;


BaseType_t read_internal_temp(void *context, sensor_value_t *value);
// 读取LED状态的函数
BaseType_t read_led_state(void *context, sensor_value_t *value);
// 写入/控制LED状态的函数
BaseType_t write_led_state(void *context, const sensor_value_t *value);

void sensor_registry_init(void);

BaseType_t find_sensor_by_id_and_copy(const char* id, sensor_config_t* out_sensor);

#endif //INC_12_FREERTOS_LWIP_MQTT_NEWLAND_SENSOR_MANAGER_H